package com.cwj.jmh;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author chenwujie
 * @date 2021-03-08 13:30
 *
 * 自旋：
 *
 * accumulateAndGet   根据一个操作数设置新值
 * getAndAccumulate
 *
 * addAndGet			对原值增加
 * getAndAdd
 *
 * decrementAndGet		对原值减一
 * getAndDecrement
 *
 * getAndIncrement     对原值加一
 * incrementAndGet
 *
 * getAndUpdate		根据一个操作数 更新原值
 * updateAndGet
 * getAndSet			更新原值
 *
 * 快速返回：
 * compareAndSet
 * weakCompareAndSet
 */

@Measurement(iterations = 10)
@Warmup(iterations = 10)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Fork(1)
public class AtomicIntegerTest {

    private AtomicInteger atcInt;

    @Setup(Level.Invocation)
    public void setUp() {
        this.atcInt = new AtomicInteger(0);
    }

    @Benchmark
    public void test() {
        this.atcInt.set(10);
    }

    @Benchmark
    public void test2() {
        this.atcInt.lazySet(10);
    }

    public static void main(String[] args) throws RunnerException {
        Options opts = new OptionsBuilder().include(AtomicIntegerTest.class.getSimpleName()).build();
        new Runner(opts).run();
    }
}
